编译和运行 Echo 服务器和客户端

    在例子 chapter2 目录下,执行

    输出如下

    Listing 2.6 Build Output

    1. [INFO] Scanning for projects...
    2. [INFO] --------------------------------------------------------------------
    3. [INFO] Reactor Build Order:
    4. [INFO]
    5. [INFO] Echo Client and Server
    6. [INFO] Echo Client
    7. [INFO] Echo Server
    8. [INFO]
    9. [INFO] --------------------------------------------------------------------
    10. [INFO] Building Echo Client and Server 1.0-SNAPSHOT
    11. [INFO] --------------------------------------------------------------------
    12. [INFO]
    13. [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ echo-parent ---
    14. [INFO]
    15. [INFO] --------------------------------------------------------------------
    16. [INFO] Building Echo Client 1.0-SNAPSHOT
    17. [INFO] --------------------------------------------------------------------
    18. [INFO]
    19. [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ echo-client ---
    20. [INFO]
    21. [INFO] --- maven-compiler-plugin:3.1:compile (default-compile)
    22. @ echo-client ---
    23. [INFO] Changes detected - recompiling the module!
    24. [INFO] --------------------------------------------------------------------
    25. [INFO] Reactor Summary:
    26. [INFO]
    27. [INFO] Echo Client and Server ......................... SUCCESS [ 0.118 s]
    28. [INFO] Echo Client .................................... SUCCESS [ 1.219 s]
    29. [INFO] Echo Server .................................... SUCCESS [ 0.110 s]
    30. [INFO] --------------------------------------------------------------------
    31. [INFO] BUILD SUCCESS
    32. [INFO] --------------------------------------------------------------------
    33. [INFO] Total time: 1.561 s
    34. [INFO] Finished at: 2014-06-08T17:39:15-05:00
    35. [INFO] Final Memory: 14M/245M
    36. [INFO] --------------------------------------------------------------------

    注意事项:

    • Netty artifact 没在用户的本地存储库中找到,所以 Maven 就会从互联网上下载
    • clean 和 compile 在构建生命周期的运行。事后 mavensurefire-plugin
      插件运行,但不会有测试类存在。最后 mavenjar-plugin 执行

    运行 Echo 服务器 和 客户端

    我们使用 exec-maven-plugin 来运行项目。

    在 chapter2/Server 目录,执行

    输出如下:

    在 chapter2/Client 目录,执行

    1. mvn exec:java
    1. [INFO] Scanning for projects...
    2. [INFO]
    3. [INFO] --------------------------------------------------------------------
    4. [INFO] Building Echo Client 1.0-SNAPSHOT
    5. [INFO] --------------------------------------------------------------------
    6. [INFO]
    7. [INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ echo-client >>>
    8. [INFO]
    9. [INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ echo-client <<<
    10. [INFO]
    11. [INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ echo-client ---
    12. Client received: Netty rocks!
    13. [INFO] --------------------------------------------------------------------
    14. [INFO] BUILD SUCCESS
    15. [INFO] --------------------------------------------------------------------
    16. [INFO] Total time: 3.907 s
    17. [INFO] Finished at: 2014-06-08T18:26:14-05:00
    18. [INFO] Final Memory: 8M/245M
    19. [INFO] --------------------------------------------------------------------

    在服务器的控制台输出:

    发生了什么事:

    • 客户端连接后,它发送消息:“Netty rocks!”
    • 服务器输出接收到消息并将其返回给客户端
    • 客户输出接收到的消息并退出。

    每次运行客户端,你会看到在服务器的控制台输出:

    1. Server received: Netty rocks!

    现在,我们看下错误的情况。在控制台 输入 Ctrl-C 来关闭服务器。而后运行客户端,此时输出如下:

    1. [INFO] Scanning for projects...
    2. [INFO]
    3. [INFO] --------------------------------------------------------------------
    4. [INFO] Building Echo Client 1.0-SNAPSHOT
    5. [INFO] --------------------------------------------------------------------
    6. [INFO]
    7. [INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ echo-client >>>
    8. [INFO]
    9. [INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ echo-client <<<
    10. [INFO]
    11. [INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ echo-client ---
    12. [WARNING]
    13. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    14. at sun.reflect.NativeMethodAccessorImpl.invoke
    15. at sun.reflect.DelegatingMethodAccessorImpl.invoke
    16. (DelegatingMethodAccessorImpl.java:43)
    17. at java.lang.reflect.Method.invoke(Method.java:606)
    18. at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
    19. at java.lang.Thread.run(Thread.java:744)
    20. Caused by: java.net.ConnectException: Connection refused:
    21. no further information: localhost/127.0.0.1:9999
    22. at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    23. at sun.nio.ch.SocketChannelImpl.finishConnect
    24. (SocketChannelImpl.java:739)
    25. at io.netty.channel.socket.nio.NioSocketChannel
    26. .doFinishConnect(NioSocketChannel.java:191)
    27. at io.netty.channel.nio.
    28. AbstractNioChannel$AbstractNioUnsafe.finishConnect(
    29. AbstractNioChannel.java:279)
    30. at io.netty.channel.nio.NioEventLoop
    31. .processSelectedKey(NioEventLoop.java:511)
    32. at io.netty.channel.nio.NioEventLoop
    33. .processSelectedKeysOptimized(NioEventLoop.java:461)
    34. at io.netty.channel.nio.NioEventLoop
    35. .processSelectedKeys(NioEventLoop.java:378)
    36. at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:350)
    37. at io.netty.util.concurrent
    38. .SingleThreadEventExecutor$2.run
    39. (SingleThreadEventExecutor.java:101)
    40. ... 1 more
    41. [INFO] --------------------------------------------------------------------
    42. [INFO] BUILD FAILURE
    43. [INFO] --------------------------------------------------------------------
    44. [INFO] Total time: 3.728 s
    45. [INFO] Finished at: 2014-06-08T18:49:13-05:00
    46. [INFO] Final Memory: 8M/245M
    47. [INFO] --------------------------------------------------------------------
    48. [ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:java
    49. (default-cli) on project echo-client: An exception occured while executing the
    50. Java class. null: InvocationTargetException: Connection refused: no further
    51. localhost/127.0.0.1:9999 -> [Help 1]